package com.gupaoedu.pattern.singleton.register;

import java.io.ObjectInputStream;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

/**
 * 2019/5/11
 * created by chenpp
 * 容器式单例  仿照spring的方式,给每个类型一个className，懒加载,会有锁资源的竞争,但是方便管理大量的单例
 * 缺点:反序列化和反射都可以破坏单例
 */
public class ContainerSingleton {
    private static Map<String,Object> container = new ConcurrentHashMap<String ,Object>();
    //虽然Map是线程安全的,但是getBean线程不安全,而且可以在外面通过反射破坏单例(直接自己newInstance()),对于反序列化也可以破坏单例
    public static Object getBean(String className){
        //解决线程安全问题
        synchronized (container){
            if (container.containsKey(className)) {
                return container.get(className);
            }else{
                Object obj = null;
                try {
                    Class clazz = Class.forName(className);
                    obj=clazz.newInstance();
                    container.put(className,obj);
                    return obj;
                } catch (Exception e) {
                    e.printStackTrace();
                }
                return obj;
            }
        }

    }
}
